#ifndef __SNAKE_H__
#define __SNAKE_H__

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#include <string.h>
#include <conio.h>
#include <windows.h>
#include <stdbool.h>
#include <ctype.h>

//基础数值
#define WIDTH 60
#define HEIGHT 20
#define SNAKE_HEAD "\u25CF"
#define SNAKE_BODY "\u25CB"
#define FOOD "\u25A0"
#define MAX_SNAKE_SIZE (WIDTH-2)*(HEIGHT-2)
#define BACKGROUND " "
#define MAX_REFRESH_RATE 230
#define MIN_REFRESH_RATE 30

//颜色相关
#define BLACK         0  // 黑色
#define BLUE          1  // 蓝色
#define GREEN         2  // 绿色
#define CYAN          3  // 青色，一种介于蓝色和绿色之间的颜色
#define RED           4  // 红色
#define MAGENTA       5  // 品红色，也叫洋红色，常用于四色印刷
#define BROWN         6  // 棕色
#define LIGHTGRAY     7  // 浅灰色
#define DARKGRAY      8  // 深灰色
#define LIGHTBLUE     9  // 浅蓝色
#define LIGHTGREEN   10  // 浅绿色
#define LIGHTCYAN    11  // 浅青色
#define LIGHTRED     12  // 浅红色
#define LIGHTMAGENTA 13  // 浅品红色
#define YELLOW       14  // 黄色
#define WHITE        15  // 白色

//定义蛇身对象
typedef struct
{
    int x;
    int y;
} Body;

//定义蛇对象
typedef struct
{
    Body body[MAX_SNAKE_SIZE];
    int size;
} Snake;

//定义食物对象
typedef struct
{
    int x;
    int y;
} Food;

//全局变量

Snake snake;//蛇对象
Food food;//食物对象
int score = 0;//分数
int kx = 0, ky = 0;//坐标增量
COORD coord;//光标坐标
char direction = 'd';//蛇的方向，默认为向右
char directionNew = 'd';//新的方向，用于避免原地调头
Body snakeTail;//蛇的尾巴坐标
int sleepTime = 150;//刷新率
bool ifEatFood;//记录蛇是否吃到食物
int maxScore;//最高分
char choice;//菜单选择
int gameStatus;//游戏状态，1代表运行，0代表停止
int foodScore = 10;//食物提供的分数，默认为10

//函数声明

//更新最高分
void updateMaxScore(void);
//读取最高分
void readMaxScore(void);
//检测是否打破最高分
bool ifBreak(void);
//绘制菜单
void displayMenu(void);
//显示最大分数
void displayMaxScore(void);
//绘制地图
void drawMap(void);
//在地图的右边显示最高分，速度，得分等游戏信息
void displayInformation(void);
//更新游戏信息
void updateInformation(void);
//显示游戏说明
void displayInstruction(void);
//蛇的初始化
void initSnake(void);
//食物的初始化
void initFood(void);
//根据蛇的坐标画蛇（不改变其他）
void drawSnake(void);
//更新蛇（不重绘）
void updateSnake(void);
//画食物
void drawFood(void);
//游戏模块
void startGame(void);
//结束游戏
void endGame(void);
//加分
void scorePlus(void);
//蛇移动
void snakeMove(void);
//改变蛇的行进方向
//tips:实际上这个函数承担了游戏期间读取所有输入的功能，但我懒得改名字
void getDirection(void);
//判断方向输入是否冲突
bool ifDirectionCollide(void);
//判断新输入是否合法
bool ifDirectionNewCorrect(void);
//判断蛇是否在场地内
bool inField(void);
//判断食物是否和蛇身重合
bool ifOverlap(void);
//判断蛇是否撞身体
bool ifCrash(void);
//判断蛇是否吃到食物
bool ifEat(void);
//加速
void speedUp(void);
//减速
void speedDown(void);
//重置颜色
void resetColor(void);
//设置颜色
void setColor(int color);

#endif